#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //事件过滤器是在应用程序分发到 event事件分发器 之前，再做一次更高级的拦截。
    //事件过滤器的一般使用步骤：
    //1、安装事件过滤器；
    //2、重写事件过滤器函数eventFilter()

    //当一个事件发生并且被发送到一个对象（我们称其为 targetObj）时
    //如果在 targetObj 上安装了一个或多个事件过滤器，这些事件将首先被发送到对应的过滤器对象。
    //事件过滤器对象的 eventFilter() 方法将被调用，事件对象和事件目标作为参数传入。

    //在 eventFilter() 方法中，你可以编写代码来决定如何处理这些事件：
    //如果你想拦截事件（即阻止事件继续传递到目标对象），eventFilter() 应返回 true。
    //如果你允许事件继续传递到目标对象（即事件过滤器只是观察或记录，不干预事件），eventFilter() 应返回 false。

    //这里的代码的意思是
    //MainWindow这个对象安装事件过滤器,然后按照MainWindow中的eventFilter()来进行处理
    this->installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        qDebug() << "鼠标左键被按下!";
    }
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
   qDebug() << event->key();
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    static int a = 1;
    //判断控件
    if (obj == this) {
        if (event->type() == QEvent::KeyPress) {
            qDebug() << a++;
        }else if (event->type() == QEvent::MouseButtonPress) {
            qDebug() << a--;
        }
        return true;
    }

    //其他交给父类来进行处理
    return QWidget::eventFilter(obj, event);
}

